<?php
require BONE_ROOT . DS . 'system' . DS . 'obj.php';

require BONE_ROOT . DS . 'system' . DS . 'db.php';
require BONE_ROOT . DS . 'system' . DS . 'lib.php';
require BONE_ROOT . DS . 'system' . DS . 'menu.php';

require BONE_ROOT . DS . 'system' . DS . 'app.php';
require BONE_ROOT . DS . 'system' . DS . 'controller.php';
require BONE_ROOT . DS . 'system' . DS . 'table.php';
require BONE_ROOT . DS . 'system' . DS . 'model.php';
require BONE_ROOT . DS . 'system' . DS . 'template.php';
require BONE_ROOT . DS . 'system' . DS . 'ui.php';

require BONE_ROOT . DS . 'system' . DS . 'session.php';

/**
 * 骨头系统资源工厂
 */
abstract class bone
{
    
    public static $libs = array(); // 保存系统的库实例, 存放第三方库    
    public static $configs = array(); // 保存配置文件实例    
    public static $menus = array(); // 保存系统的菜单实例
    

    public static $apps = array(); // 保存应用信息
    

    public static $controllers = array(); // 保存应用的控制器实例    
    public static $models = array(); // 保存应用的模型实例    
    public static $templates = array(); // 保存应用的模板实例    
    public static $uis = array(); // 保存用户界面实例    
    

    public static $users = array(); // 保存用户实例    
    

    public static $version = '2.0'; // 系统版本号    

    
    /**
     * 获取 mysql 数据库实例
     * @return object
     */
    public static function get_db()
    {
        $config_db = bone::get_config('db');
        return db::get_instance($config_db->host, $config_db->user, $config_db->pass, $config_db->name);
    }

    /**
     * 获取一个库的实例
     * @param string $lib 库名
     * @return object
     */
    public static function &get_lib($lib)
    {
        if (!array_key_exists($lib, self::$libs))
        {
            $class_name = 'lib_' . $lib;
            if(!class_exists($class_name)) include BONE_ROOT . DS . 'libs' . DS . $lib . DS . $lib . '.php';
            self::$libs[$lib] = new $class_name();
        }
        return self::$libs[$lib];
    }

    /** 
     * 获取一个菜单
     * @param string $menu 菜单名
     * @return object
     */
    public static function &get_menu($menu)
    {
        $path = BONE_ROOT . DS . 'menus' . DS . $menu . '.php';
        if (!array_key_exists($path, self::$menus))
        {
            $class_name = 'menu_' . $menu;
            if(!class_exists($class_name)) include $path;
            self::$menus[$path] = new $class_name();
        }
        return self::$menus[$path];
    }

    /** 
     * 获取一个后台菜单
     * @param string $menu 菜单名
     * @return object
     */
    public static function &get_admin_menu($menu)
    {
        $path = BONE_ADMIN . DS . 'menus' . DS . $menu . '.php';
        if (!array_key_exists($path, self::$menus))
        {
            $class_name = 'admin_menu_' . $menu;
            if(!class_exists($class_name)) include $path;
            self::$menus[$path] = new $class_name();
        }
        return self::$menus[$path];
    }

    /** 
     * 获取一个配置文件， 系统的  configs 文件夹内
     * @param string $config 配置文件名
     * @return object
     */
    public static function &get_config($config)
    {
        $path = BONE_ROOT . DS . 'configs' . DS . $config . '.php';
        if (!array_key_exists($path, self::$configs))
        {
            $class_name = 'config_' . $config;
            if(!class_exists($class_name)) include $path;
            self::$configs[$path] = new $class_name();
        }
        return self::$configs[$path];
    }

    /** 
     * 获取一个后台配置文件， 系统的后台目录下的  configs 文件夹内
     * @param string $config 配置文件名
     * @return object
     */
    public static function &get_admin_config($config)
    {
        $path = BONE_ADMIN . DS . 'configs' . DS . $config . '.php';
        if (!array_key_exists($path, self::$configs))
        {
            $class_name = 'admin_config_' . $config;
            if(!class_exists($class_name)) include $path;
            self::$configs[$path] = new $class_name();
        }
        return self::$configs[$path];
    }

    /** 
     * 获取应用信息
     * @param string $app 应用名
     * @return object
     */
    public static function &get_app($app)
    {
        $path = BONE_ADMIN . DS . 'apps' . DS . $app . DS . $app . '.php';
        if (!array_key_exists($path, self::$apps))
        {
            $class_name = 'app_' . $app;
            if(!class_exists($class_name)) include $path;
            self::$apps[$path] = new $class_name();
        }
        return self::$apps[$path];
    }

    /** 
     * 获取应用的一个配置文件
     * @param string $app 应用名
     * @param string $config 配置文件名
     * @return object
     */
    public static function &get_app_config($app, $config)
    {
        $path = BONE_ROOT . DS . 'apps' . DS . $app . DS . 'configs' . DS . $config . '.php';
        if (!array_key_exists($path, self::$configs))
        {
            $class_name = 'app_config_' . $app . '_' . $config;
            if(!class_exists($class_name)) include $path;
            self::$configs[$path] = new $class_name();
        }
        return self::$configs[$path];
    }

    /** 
     * 获取应用的一个后台配置文件
     * @param string $app 应用名
     * @param string $config 配置文件名
     * @return object
     */
    public static function &get_admin_app_config($app, $config)
    {
        $path = BONE_ADMIN . DS . 'apps' . DS . $app . DS . 'configs' . DS . $config . '.php';
        if (!array_key_exists($path, self::$configs))
        {
            $class_name = 'admin_app_config_' . $app . '_' . $config;
            if(!class_exists($class_name)) include $path;
            self::$configs[$path] = new $class_name();
        }
        return self::$configs[$path];
    }

    /** 
     * 获取指定应用的一个控制器
     * @param string $app 应用名
     * @param string $controller 控制器名
     * @return object
     */
    public static function &get_controller($app, $controller)
    {
        $path = BONE_ROOT . DS . 'apps' . DS . $app . DS . 'controllers' . DS . $controller . '.php';
        if (!array_key_exists($path, self::$controllers))
        {
            $class_name = 'controller_' . $app . '_' . $controller;
            if(!class_exists($class_name)) include $path;
            $instance = new $class_name();
            $instance->set_app($app);
            $instance->set_controller($controller);
            self::$controllers[$path] = $instance;
        }
        return self::$controllers[$path];
    }

    /** 
     * 获取指定应用的一个后台控制器
     * @param string $app 应用名
     * @param string $controller 控制器名
     * @return object
     */
    public static function &get_admin_controller($app, $controller)
    {
        $path = BONE_ADMIN . DS . 'apps' . DS . $app . DS . 'controllers' . DS . $controller . '.php';
        if (!array_key_exists($path, self::$controllers))
        {
            $class_name = 'admin_controller_' . $app . '_' . $controller;
            if(!class_exists($class_name)) include $path;
            $instance = new $class_name();
            $instance->set_app($app);
            $instance->set_controller($controller);
            self::$controllers[$path] = $instance;
        }
        return self::$controllers[$path];
    }

    /** 
     * 获取指定应用的一个表
     * @param string $app 应用名
     * @param string $table 表名
     * @return object
     */
    public static function &get_table($app, $table)
    {
        $class_name = 'table_' . $app . '_' . $table;
        if(!class_exists($class_name)) include BONE_ROOT . DS . 'apps' . DS . $app . DS . 'tables' . DS . $table . '.php';
        $table = new $class_name();
        return $table;
    }

    /** 
     * 获取指定应用的一个后台表
     * @param string $app 应用名
     * @param string $table 表名
     * @return object
     */
    public static function &get_admin_table($app, $table)
    {
        $class_name = 'admin_table_' . $app . '_' . $table;
        if(!class_exists($class_name)) include BONE_ADMIN . DS . 'apps' . DS . $app . DS . 'tables' . DS . $table . '.php';
        $table = new $class_name();
        return $table;
    }


    /** 
     * 获取指定应用的一个模型
     * @param string $app 应用名
     * @param string $model 模型名
     * @return object
     */
    public static function &get_model($app, $model)
    {
        $path = BONE_ROOT . DS . 'apps' . DS . $app . DS . 'models' . DS . $model . '.php';
        if (!array_key_exists($path, self::$models))
        {
            $class_name = 'model_' . $app . '_' . $model;
            if(!class_exists($class_name)) include $path;
            self::$models[$path] = new $class_name();
        }
        return self::$models[$path];
    }

    /** 
     * 获取指定应用的一个后台模型
     * @param string $app 应用名
     * @param string $model 模型名
     * @return object
     */
    public static function &get_admin_model($app, $model)
    {
        $path = BONE_ADMIN . DS . 'apps' . DS . $app . DS . 'models' . DS . $model . '.php';
        if (!array_key_exists($path, self::$models))
        {
            $class_name = 'admin_model_' . $app . '_' . $model;
            if(!class_exists($class_name)) include $path;
            self::$models[$path] = new $class_name();
        }
        return self::$models[$path];
    }

    /** 
     * 获取指定应用的一个模板
     * @param string $app 应用名
     * @param string $controller 控制器名
     * @param string $template 模板名
     * @return object
     */
    public static function &get_template($app, $controller, $template)
    {
        $config = bone::get_config('system');
        include_once BONE_ROOT . DS . 'themes' . DS . $config->theme . DS . 'theme.php';
        
        $path = BONE_ROOT . DS . 'apps' . DS . $app . DS . 'templates' . DS . $controller . DS . $template . '.php';
        if (!array_key_exists($path, self::$templates))
        {
            $class_name = 'template_' . $app . '_' . $controller . '_' . $template;
            if(!class_exists($class_name)) include $path;
            self::$templates[$path] = new $class_name();
        }
        return self::$templates[$path];
    }

    /** 
     * 获取指定应用的一个后台模板
     * @param string $app 应用名
     * @param string $controller 控制器名
     * @param string $template 模板名
     * @return object
     */
    public static function &get_admin_template($app, $controller, $template)
    {
        include_once BONE_ADMIN . DS . 'theme' . DS . 'admin_theme.php';
        
        $path = BONE_ADMIN . DS . 'apps' . DS . $app . DS . 'templates' . DS . $controller . DS . $template . '.php';
        if (!array_key_exists($path, self::$templates))
        {
            $class_name = 'admin_template_' . $app . '_' . $controller . '_' . $template;
            if(!class_exists($class_name)) include $path;
            self::$templates[$path] = new $class_name();
        }
        return self::$templates[$path];
    }

    /** 
     * 获取指定的一个界面    
     * @param string $ui 界面组件名
     * @return object
     */
    public static function &get_ui($ui)
    {
        $path = BONE_ROOT . DS . 'uis' . DS . $ui . DS . $ui . '.php';
        if (!array_key_exists($path, self::$uis))
        {
            $class_name = 'ui_' . $ui;
            if(!class_exists($class_name)) include $path;
            self::$uis[$path] = new $class_name();
        }
        return self::$uis[$path];
    }

    /** 
     * 获取指定的一个后台界面       
     * @param string $ui 界面组件名
     * @return object
     */
    public static function &get_admin_ui($ui)
    {
        $path = BONE_ADMIN . DS . 'uis' . DS . $ui . DS . $ui . '.php';
        if (!array_key_exists($path, self::$uis))
        {
            $class_name = 'admin_ui_' . $ui;
            if(!class_exists($class_name)) include $path;
            self::$uis[$path] = new $class_name();
        }
        return self::$uis[$path];
    }

    /** 
     * 获取一个用户 实例
     * @param int $id 用户编号
     * @return object
     */
    public static function &get_user($id = 0)
    {
        if (!$id)
        {
            $user = self::get_session()->get('user');
            if ($user)
                return $user;
            else
            {
                $user = new stdClass();
                $user->id = 0;
                return $user;
            }
        }
        else if (!array_key_exists($id, self::$users))
        {
            $db = bone::get_db();
            $user = $db->get_obj('SELECT * FROM `bone_user` WHERE `id`=' . $id);
            unset($user->password);
            unset($user->key);
            self::$users[$id] = $user;
        }
        
        return self::$users[$id];
    }

    /** 
     * 获取后台管理员用户 实例
     * @param int $id 用户编号
     * @return object
     */
    public static function &get_admin()
    {
        $user = self::get_session()->get('admin');
        if ($user === null)
        {
            $user = new stdClass();
            $user->id = 0;
        }
        return $user;
    }

    /** 
     * 获取 session 实例
     * @return object
     */
    public static function &get_session()
    {
        return session::get_instance();
    }

    /** 
     * 获取系统版本号
     * @return string
     */
    public static function get_version()
    {
        return self::$version;
    }

}
